import { _decorator, CCInteger, Component, Node, Prefab, Vec3} from 'cc';
import NodePoolManager from '../NodePool/NodePoolManager';
import { Enemy1Control } from './Enemy1Control';

const { ccclass, property } = _decorator;
// 第1话：接纳不完美的自己，先从简单开始吧

@ccclass('EnemyManager')
export class EnemyManager extends Component {
    @property(Prefab)
    Enemy1: Prefab = null;
    @property(CCInteger)
    private Enemy1Count: number = 5;


    private Enemy1Pos: Vec3[] = [];

    onLoad() {

    }
    // async异步，onEnable在组件启用时调用，和组件的启用禁止状态有关
    async onEnable() {
        // 设置敌人1自动生成的位置
        this.Enemy1Pos.push(new Vec3(50, -120, 0));
        this.Enemy1Pos.push(new Vec3(600, -140, 0));
        this.Enemy1Pos.push(new Vec3(80, -200, 0));
        this.Enemy1Pos.push(new Vec3(560, -280, 0));
        // 触发钩子开始生成怪物
        this.renderEnemies();
    }

    renderEnemies() {

        for (let i = 1; i <= this.Enemy1Count; i++) {

            // 生成新的怪物时候就使用对象池封装的获取缓存节点的方法，
            // 		内部逻辑已经兼容了没空闲的缓存节点则 instantiate 一个新的节点对象
            const enemyNode = NodePoolManager._instance.getNodeFromPool(`Enemy-${i}`, this.Enemy1);
            // 随机一个位置给新生成的敌人1做初始化
            let Enemy1RandomPos= this.Enemy1Pos[this.getRandomNumber(0, this.Enemy1Pos.length - 1)];
            // getNodeFromPool 返回的是一个 Node 节点，可以进行后续根据配置重新初始化以及放置到渲染层级的操作
            const EnemyNodeController = enemyNode.getComponent(Enemy1Control);
            EnemyNodeController.initEnemy(Enemy1RandomPos);
            this.node.insertChild(enemyNode, 0);
        }
    }

    /**
     * @func getRandomNumber的函数，该函数接受两个参数min和max ，
     *       分别表示随机数的最小值和最大值。
     *       函数内部使用Math.random()方法生成一个介于0和1之间的随机小数
     *       然后通过乘积和偏移
     *       计算得到一个介于min和max 之间的随机数。
     *       最后，使用Math.floor()方法将随机数取整，返回一个整型随机数。
     * @param min 随机数最小值
     * @param max 随机数最大值
     * @return 返回介于min和max之间整形随机数       
     */
    getRandomNumber(min: number, max: number): number {
        // 生成min到max之间的随机数
        return Math.floor(Math.random() * (max - min + 1) + min);
    }
}


